#pragma once

#ifdef KLINE_EXPORTS
#define KLINE_API __declspec(dllexport)
#else
#define KLINE_API __declspec(dllimport)
#endif

#include "imgui.h"
#include "stock_data_struct.h"
#include <vector>
#include <string>

// K线数据结构
struct KLINE_API KLineData {
    float open;
    float high;
    float low;
    float close;
};

// 导出的函数声明
extern "C" {
    // 初始化K线数据
    KLINE_API void initKLineData(const std::vector<StockData>& data);
    
    // 设置显示的日期范围
    KLINE_API void setDateRange(const std::string& startDate, const std::string& endDate);
    
    // 更新K线数据 数据与渲染分开 不然买卖计算的时机不对
    KLINE_API void updateKLineData();

    // 绘制K线
    KLINE_API void drawKLine(ImDrawList* drawList, ImVec2 pos, ImVec2 size);

    // 取最后的收盘价
    KLINE_API double getLastClosePrice();

    // 获取指定日期的K线数据
    // 返回值：
    // true - 成功获取指定日期的K线
    // false - 没有指定日期的K线数据
    KLINE_API bool getKLineByDate(const char* date, StockData* klineData);

    // 获取5日均线
    KLINE_API double getMA5();

    // 获取10日均线
    KLINE_API double getMA10();

    // 获取20日均线
    KLINE_API double getMA20();
    
    // 获取5日均线
    KLINE_API double getLastMA5();

    // 获取10日均线
    KLINE_API double getLastMA10();

    // 获取20日均线
    KLINE_API double getLastMA20();

    // 获取90天内的波动范围 高
    KLINE_API double get90DaysHeigh();

    // 获取90天内的波动范围 低
    KLINE_API double get90DaysLow();

    // 获取前一天的价格
    KLINE_API double getLastDayPrice();

    // 出现锤子线或星线
    KLINE_API bool isHammerOrStar();
} 